Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Ruby (Programmiersprache)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Ruby_(Programmiersprache)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Ruby_Programmiersprache rootpage-Ruby_Programmiersprache skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Ruby (Programmiersprache)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><table class="float-right infobox toccolours toptextcells" style="font-size:90%; margin-top:0; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:larger;">Ruby
</th></tr>
<tr>
<td colspan="2" class="notheme" style="text-align:center; background-color:#f8f9fa;"><span typeof="mw:File"></span>
</td></tr>


<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
</th></tr>
<tr>
<td><b><a href="Programmierparadigma" title="Programmierparadigma">Paradigmen</a>:</b>
</td>
<td>multiparadigmatisch, tief integrierte Objektorientierung
</td></tr>

<tr>
<td><b>Erscheinungsjahr:</b>
</td>
<td><span class="wikidata-content">1995<sup id="cite_ref-_e0d9a819dcdfffc1_1-0" class="reference"><a href="#cite_note-_e0d9a819dcdfffc1-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup></span>
</td></tr>

<tr>
<td><b>Designer:</b>
</td>
<td><span class="wikidata-content"><a href="Yukihiro_Matsumoto" title="Yukihiro Matsumoto">Yukihiro Matsumoto</a></span>
</td></tr>
<tr>
<td><b>Entwickler:</b>
</td>
<td><a href="Yukihiro_Matsumoto" title="Yukihiro Matsumoto">Yukihiro Matsumoto</a> und andere
</td></tr>
<tr>
<td><b>Aktuelle&nbsp;<a href="Version_(Software)" title="Version (Software)">Version</a></b>
</td>
<td class="wikidata-content" style="white-space:nowrap;">4.0<sup id="cite_ref-_03a3180b7ac7d47d_2-0" class="reference"><a href="#cite_note-_03a3180b7ac7d47d-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>&nbsp;<small>(25. Dezember 2025)</small>
</td></tr>


<tr>
<td><b><a href="Typisierung_(Informatik)" title="Typisierung (Informatik)">Typisierung</a>:</b>
</td>
<td><a href="Starke_Typisierung" title="Starke Typisierung">stark</a>, <a href="Dynamische_Typisierung" title="Dynamische Typisierung">dynamisch</a> („<a href="Duck-Typing" title="Duck-Typing">Duck-Typing</a>“)
</td></tr>
<tr>
<td><b>Wichtige <a href="Implementierung" title="Implementierung">Implementierungen</a>:</b>
</td>
<td>MRI / CRuby (YARV), <a href="JRuby" title="JRuby">JRuby</a>, <a href="Rubinius" title="Rubinius">Rubinius</a> (siehe <a href="#Implementierungen">unten</a>)
</td></tr>




<tr>
<td><b>Beeinflusst von:</b>
</td>
<td><a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk</a>, <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>, <a href="Python_(Programmiersprache)" title="Python (Programmiersprache)">Python</a>, <a href="Lisp" title="Lisp">Lisp</a>, <a href="CLU_(Programmiersprache)" title="CLU (Programmiersprache)">CLU</a>, <a href="Eiffel_(Programmiersprache)" title="Eiffel (Programmiersprache)">Eiffel</a>, <a href="Ada_(Programmiersprache)" title="Ada (Programmiersprache)">Ada</a>, <a href="Dylan_(Programmiersprache)" title="Dylan (Programmiersprache)">Dylan</a>, <a href="JavaScript" title="JavaScript">JavaScript</a>
</td></tr>
<tr>
<td><b>Beeinflusste:</b>
</td>
<td><a href="Crystal_(Programmiersprache)" title="Crystal (Programmiersprache)">Crystal</a>, <a href="D_(Programmiersprache)" title="D (Programmiersprache)">D</a>,<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> <a href="Elixir_(Programmiersprache)" title="Elixir (Programmiersprache)">Elixir</a>, <a href="Groovy" title="Groovy">Groovy</a>, <a href="Rust_(Programmiersprache)" title="Rust (Programmiersprache)">Rust</a>, <a href="Swift_(Programmiersprache)" title="Swift (Programmiersprache)">Swift</a>
</td></tr>
<tr>
<td><b><a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a>:</b>
</td>
<td><a href="Plattformunabh%C3%A4ngigkeit" title="Plattformunabhängigkeit">plattformübergreifend</a>
</td></tr>
<tr>
<td><b><a href="Lizenz" title="Lizenz">Lizenz</a>:</b>
</td>
<td><a href="BSD-Lizenz" title="BSD-Lizenz">2-clause BSD</a> und eigene (siehe <a href="#Nutzungsbedingungen">Nutzungsbedingungen</a>)
</td></tr>
<tr>
<td colspan="2" class="hintergrundfarbe5" style="text-align:center;"><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/de/">ruby-lang.org</a>
</td></tr></tbody></table>
<p><b><span lang="en">Ruby</span></b> (englisch für <i><a href="Rubin" title="Rubin">Rubin</a></i>) ist eine <a href="H%C3%B6here_Programmiersprache" title="Höhere Programmiersprache">höhere Programmiersprache</a>, die Mitte der 1990er Jahre vom Japaner <a href="Yukihiro_Matsumoto" title="Yukihiro Matsumoto">Yukihiro Matsumoto</a> entworfen wurde.
</p><p>Ruby ist <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientiert</a>, unterstützt aber mehrere weitere <a href="Programmierparadigma" title="Programmierparadigma">Programmierparadigmen</a> (unter anderem <a href="Prozedurale_Programmierung" title="Prozedurale Programmierung">prozedurale</a> und <a href="Funktionale_Programmierung" title="Funktionale Programmierung">funktionale Programmierung</a> sowie <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">Nebenläufigkeit</a>), bietet <a href="Dynamische_Typisierung" title="Dynamische Typisierung">dynamische Typisierung</a>, <a href="Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Reflexion</a> und <a href="Automatische_Speicherbereinigung" class="mw-redirect" title="Automatische Speicherbereinigung">automatische Speicherbereinigung</a>. Ein Programm in Ruby wird zur Laufzeit <a href="Interpreter" title="Interpreter">interpretiert</a>. 2012 wurde die Ruby-Spezifikation als internationale Norm ISO/IEC 30170 standardisiert.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>

<div class="mw-heading mw-heading2"><h2 id="Entstehung_und_Geschichte">Entstehung und Geschichte</h2></div>

<p>Yukihiro „Matz“ Matsumoto begann 1993 an einer eigenen Sprache zu arbeiten und gab am 21.&nbsp;Dezember 1995 die erste Version von Ruby, 0.95, frei.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Den Namen, hergeleitet vom <a href="Schmuckstein" title="Schmuckstein">Edelstein</a> <a href="Rubin" title="Rubin">Rubin</a>, wählte er als Anspielung auf die Programmiersprache <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> Matsumotos Ziel bei der Erschaffung der neuen Sprache war, eine Synthese aus Elementen der von ihm geschätzten Programmiersprachen <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>, <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk</a>, <a href="Eiffel_(Programmiersprache)" title="Eiffel (Programmiersprache)">Eiffel</a>, <a href="Ada_(Programmiersprache)" title="Ada (Programmiersprache)">Ada</a> und <a href="Lisp" title="Lisp">Lisp</a> zu bilden und <a href="Funktionale_Programmierung" title="Funktionale Programmierung">funktionale</a> und <a href="Imperative_Programmierung" title="Imperative Programmierung">imperative</a> <a href="Programmierparadigma" title="Programmierparadigma">Programmierparadigmen</a> in Einklang zu bringen. Darüber hinaus sollte die Sprache <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierter</a> als <a href="Python_(Programmiersprache)" title="Python (Programmiersprache)">Python</a> und zugleich mächtiger als <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a> sein. Auch Flexibilität, Ausdrucksstärke und Einfachheit spielten bereits eine gewichtige Rolle.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p><p>Besonders wichtig, neben den technischen Eigenschaften, war Matsumoto an Ruby auch die emotionale Wirkung auf Anwender, Mitentwickler und sich selbst. Matsumotos Auffassung dazu ist folgende:
</p>
<div class="Vorlage_Zitat" style="margin:1em 40px;">
<div style="margin:1em 0;"><blockquote style="margin:0;">
<p>„Natürlich unterscheidet sich Ruby von Perl oder Python an vielen Stellen, das ist schließlich Rubys Daseinsberechtigung. Rubys wesentliches Ziel ist „Freude“. Meines Wissens gibt es keine andere Sprache, die sich so sehr auf die Freude konzentriert. Rubys eigentliches Ziel ist es zu erfreuen – Sprachdesigner, Anwender, Sprachlerner, jeden. Freude allein ist jedoch nicht alles. Ruby bietet auch viele Verwendungsmöglichkeiten. Könnte man sie nicht einsetzen, würde sie doch auch keine Freude bereiten.“
</p>
</blockquote>
</div><div class="cite" style="margin:-1em 0 1em 1em;">– <style data-mw-deduplicate="TemplateStyles:r261921330">
/* start https://de.wikipedia.org/ */


.mw-parser-output .Person{font-variant:small-caps}


/* end https://de.wikipedia.org/ */
</style><span class="Person h-card">Yukihiro Matsumoto</span>: <cite style="font-style:normal">Vorwort des Sprachschöpfers in „Rubyプログラミング入門“ (übersetzt)</cite></div></div>
<p>In <a href="Japan" title="Japan">Japan</a> erlangte Ruby nach Erscheinen rasch an Bekanntheit. Im <a href="Westliche_Welt" title="Westliche Welt">Westen</a> verhalfen der Programmiersprache das Buch <i>Programming Ruby</i> (2000) (bekannt als <i>Pickaxe book</i> als Anspielung auf die Illustration auf dem Buchdeckel) und das <a href="Webframework" title="Webframework">Webframework</a> <i><a href="Ruby_on_Rails" title="Ruby on Rails">Ruby on Rails</a></i> (2004) zum Durchbruch. In den folgenden Jahren mehrte sich auch die englisch- und deutschsprachige Dokumentation sowie Literatur. Die Verkehrssprache der Kern-Entwickler wechselte von Japanisch zu Englisch. Heute wird die Sprache als <a href="Open_Source" title="Open Source">Open-Source</a>-Projekt weitergepflegt und ist Gegenstand diverser Publikationen und Kurse. Veröffentlichungen mit neuen Funktionen geschehen üblicherweise im Jahresrhythmus zur Weihnachtszeit.
</p><p>Ein Meilenstein in der Entwicklung von Ruby war die Version 1.9 im Jahr 2007, welche mit vielen Änderungen ziemlich inkompatibel zu den Vorgängerversionen wurde. Die Semantik einiger Konstrukte hat sich in dieser Version geändert.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> Der <a href="Interpreter" title="Interpreter">Interpreter</a> wurde komplett neu geschrieben, womit Rubyprogramme wesentlich schneller wurden. Zeichenketten bekamen separate <a href="Zeichenkodierung" title="Zeichenkodierung">Zeichenkodierungen</a>, Variablen in Blöcken wurden block-lokal, <a href="IPv6" title="IPv6">IPv6</a>-Unterstützung und einige syntaktische Erleichterungen fanden Einzug.
</p><p>Mit Ruby 2.0 wurden <a href="Parameter_(Informatik)#Unterschiedliche_Parameter-Begriffe" title="Parameter (Informatik)">Schlüsselwortparameter</a> eingeführt (bspw.: <code>0.step(by: 5, to: 20)</code>), das Vorhängen <i>(prepend)</i> von Modulen und <a href="Lazy_Evaluation" title="Lazy Evaluation">Bedarfsauswertung</a> <i>(lazy-evaluation)</i> von Iteratoren eingeführt. Außerdem wurde die <a href="Zeichenkodierung" title="Zeichenkodierung">Standardzeichenkodierung</a> auf <a href="UTF-8" title="UTF-8">UTF-8</a> festgelegt. Ruby 2.1 führte <i>Refinements</i> (eine Methode um Überschreibungen von Klassen lokal zu beschränken) ein. In Ruby 2.2 wurde der vorhandene <a href="Garbage_Collection" title="Garbage Collection">Garbage-Collector</a> durch einen inkrementellen ersetzt. Mit Ruby 2.3 ist es möglich, alle Zeichenketten automatisch schreibgeschützt zu erstellen und ein neuer Operator <code>&amp;.</code> <i>(Safe-Navigation-Operator)</i> zum Umgehen von Nil-Überprüfungen wurde eingeführt. In Ruby 2.4 wurden die Klassen <i>Fixnum</i> und <i>Bignum</i> vereinheitlicht. Seit Ruby 2.5 können <a href="Ausnahmebehandlung" title="Ausnahmebehandlung">Exceptions</a> in <i>do-end</i>-Blöcken ohne separate Unterblöcke gefangen werden. Ruby 2.6 lieferte den ersten Code eines optionalen <a href="Just-in-time-Kompilierung" title="Just-in-time-Kompilierung">JIT-Compilers</a> und fügte <i>Bundler</i> (s.&nbsp;u.) zur Standarddistribution hinzu. Ruby 2.7 führte ausführliches Patternmatching und einige syntaktische Erleichterungen dem Sprachkern hinzu. Jede neue Ruby-Version ab 1.9 brachte zudem Geschwindigkeitsoptimierungen verschiedenen Ausmaßes mit sich. Zusätzlich erweiterte jede Version die <a href="Standardbibliothek" title="Standardbibliothek">Standardbibliothek</a> um nützliche Methoden. Es wurde stets auf <a href="Kompatibilit%C3%A4t_(Technik)#Abwärtskompatibilität" title="Kompatibilität (Technik)">Abwärtskompatibilität</a> geachtet, allerdings nicht immer zu hundert Prozent erreicht.
</p><p>Ruby 3.0, erschienen am 25. Dezember 2020, ist die erste Version, welche die „Ruby 3x3“ genannten Forderungen erfüllt: Dreimal höhere Ausführungsgeschwindigkeit zu Ruby 2.0 (durch JIT-Compiler), Nebenläufigkeit ohne GIL (allerdings noch experimentell) und statische Typanalyse (optional). Das eigentliche Update 3.0 stellt allerdings keinen größeren Sprung als die vorherigen jährlichen Veröffentlichungen dar und ist abwärtskompatibel zu Ruby 2.x.
</p>
<div class="mw-heading mw-heading2"><h2 id="Merkmale">Merkmale</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Alles_ist_ein_Objekt">Alles ist ein Objekt</h3></div>
<p>Ruby ist eine Programmiersprache, die, obwohl sie auch viele andere Programmierparadigmen unterstützt, von Grund auf objektorientiert ist. Das bedeutet konkret, dass in Ruby ausnahmslos jeder Wert ein Objekt und jede Funktion eine Methode ist (d.&nbsp;h. einer Klasse zugeordnet ist). Ausnahmen für <a href="Datentyp#Elementare_Datentypen" title="Datentyp">primitive Datentypen</a> wie in vielen anderen objektorientierten Programmiersprachen gibt es nicht. Auch Klassen sind Objekte. Objekte speichern Instanzvariablen und haben eine Klasse. Klassen sind Objekte, die Methoden speichern und eine Vererbungshierarchie besitzen. Auf Instanzvariablen kann ausschließlich über Methoden zugegriffen werden.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">TestKlasse</span>
<span class="k">end</span>
<span class="n">test_objekt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TestKlasse</span><span class="o">.</span><span class="n">new</span>

<span class="nb">puts</span><span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># =&gt; Integer</span>
<span class="nb">puts</span><span class="w"> </span><span class="s2">"text"</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># =&gt; String</span>
<span class="nb">puts</span><span class="w"> </span><span class="n">test_objekt</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># =&gt; TestKlasse</span>
<span class="nb">puts</span><span class="w"> </span><span class="no">TestKlasse</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># =&gt; Class</span>
<span class="nb">puts</span><span class="w"> </span><span class="no">Class</span><span class="o">.</span><span class="n">class</span><span class="w"> </span><span class="c1"># =&gt; Class</span>
</pre></div>
<p>Werden in Ruby „Funktionen“ definiert, so sind das in Wirklichkeit Methoden, die dem Objekt <i>Object</i> hinzugefügt werden. In Ruby erben alle Objekte implizit von <i>Object</i>, weswegen so definierte „Funktionen“ in jedem Objekt und damit allgegenwärtig verfügbar sind. Allerdings werden diese Funktionen als <i>private</i> markiert, das heißt, sie können nicht von außen auf einem Objekt aufgerufen werden.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="c1"># Definiere „Funktion“</span>
<span class="k">def</span><span class="w"> </span><span class="nf">meine_funktion</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Hier bin ich"</span>
<span class="k">end</span>

<span class="c1"># Kann in andern Objekten wie eine Funktion benutzt werden</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ABC</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">gib_meine_funktion_aus</span>
<span class="w"> </span><span class="n">meine_funktion</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
<span class="n">mein_abc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">ABC</span><span class="o">.</span><span class="n">new</span>
<span class="n">mein_abc</span><span class="o">.</span><span class="n">gib_meine_funktion_aus</span><span class="w"> </span><span class="c1"># =&gt; Hier bin ich</span>
<span class="n">mein_abc</span><span class="o">.</span><span class="n">meine_funktion</span><span class="w"> </span><span class="c1"># =&gt; Fehlermeldung, private method `meine_funktion' called</span>
</pre></div>
<p>Da in Ruby Objekte dynamisch sind, kann man mit Ruby auch prototypbasiert programmieren. Das bedeutet grob, dass Objekte eigene Methoden haben können (außerhalb der von der Klasse vorgegebenen) und kopiert und verändert werden können (da nur Klassen Methoden beinhalten können, wird im Hintergrund eine versteckte neue Klasse nur für das eine Objekt angelegt).
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="n">auto1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Object</span><span class="o">.</span><span class="n">new</span>
<span class="k">def</span><span class="w"> </span><span class="nc">auto1</span><span class="o">.</span><span class="nf">beschleunigen</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"brumm brumm brumm"</span>
<span class="k">end</span>

<span class="n">auto1</span><span class="o">.</span><span class="n">beschleunigen</span><span class="w"> </span><span class="c1"># =&gt; "brumm brumm brumm"</span>

<span class="n">auto2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">auto1</span><span class="o">.</span><span class="n">clone</span>
<span class="k">def</span><span class="w"> </span><span class="nc">auto2</span><span class="o">.</span><span class="nf">bremsen</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"quietsch"</span>
<span class="k">end</span>

<span class="n">auto2</span><span class="o">.</span><span class="n">beschleunigen</span><span class="w"> </span><span class="c1"># =&gt; "brumm brumm brumm"</span>
<span class="n">auto2</span><span class="o">.</span><span class="n">bremsen</span><span class="w"> </span><span class="c1"># =&gt; "quietsch"</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Blöcke"><span id="Bl.C3.B6cke"></span>Blöcke</h3></div>
<p>In den meisten höheren Programmiersprachen ist es möglich, Funktionen in irgendeiner Form zusätzlich als Parameter Logik zu übergeben, sei es durch <a href="First-Class-Funktion" title="First-Class-Funktion">First-Class-Funktionen</a> oder <a href="First-Class-Objekt" title="First-Class-Objekt">First-Class-Objekte</a> (deren Methoden dann die Logik bereitstellen). Das ist in Ruby nicht anders, allerdings hat Ruby den Spezialfall, dass genau eine Funktion übergeben wird, syntaktisch (und auch von der Rechenleistung) stark optimiert. Dieser Spezialfall wird <i>Block</i> genannt, gemeint als ein Block Programmierlogik, den die Funktion zu benutzen hat.
</p><p>Blöcke werden Funktionen als separate Parameter übergeben und folgen als letztes Argument, eingegrenzt durch geschwungene Klammern oder die Schlüsselworte <i>do</i> und <i>end</i>. Im Folgenden wird die Methode <i>times</i> des Objekts 10 aufgerufen und ein Block übergeben. Beide Aufrufe sind identisch.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="mi">10</span><span class="o">.</span><span class="n">times</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Hallo Welt!"</span>
<span class="p">}</span>
<span class="mi">10</span><span class="o">.</span><span class="n">times</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Hallo Welt!"</span>
<span class="k">end</span>
</pre></div>
<p>Zusätzlich können Blöcken Parameter übergeben werden und sie haben auch einen Rückgabewert. Zum Aufrufen des übergebenen Blocks wird innerhalb der aufgerufenen Methode das Schlüsselwort <i>yield</i> verwendet. Werden nach <i>yield</i> Parameter angegeben, so werden diese dem Block übergeben, der sie zu Beginn als lokale Variablen deklarieren oder ignorieren kann. Blöcke (ebenso wie Methoden) geben automatisch den letzten Ausdruck des Blockes als Rückgabewert zurück (mittels <i>break</i> und <i>next</i> kann aber auch an anderen Stellen zurückgesprungen werden).
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">methode_die_block_aufruft</span><span class="p">(</span><span class="err">ü</span><span class="n">bergebener_parameter</span><span class="p">)</span>
<span class="w"> </span><span class="n">eigene_variable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Hallo"</span>
<span class="w"> </span><span class="n">rückgabe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">yield</span><span class="w"> </span><span class="n">eigene_variable</span><span class="p">,</span><span class="w"> </span><span class="err">ü</span><span class="n">bergebener_parameter</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rückgabe</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"ok"</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"☺"</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="c1"># Aufruf</span>
<span class="n">methode_die_block_aufruft</span><span class="p">(</span><span class="s2">"aus Ruby"</span><span class="p">)</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="o">|</span><span class="w"> </span><span class="c1"># die Blockargumente werden innerhalb || in Block-lokale Variablen umgewandelt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">p1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">" "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">p2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"!"</span>
<span class="w"> </span><span class="s2">"ok"</span>
<span class="k">end</span>
<span class="c1"># Zuerst wird im Block „Hallo aus Ruby!“ ausgegeben,</span>
<span class="c1"># dann in der Methode ☺, da der Rückgabewert „ok“ war</span>
</pre></div>
<p>Blöcke können auch in Funktionsobjekte umgewandelt werden. Wird innerhalb der Parameterliste einer Methode vor den letzten Parameter ein &amp; geschrieben, wandelt Ruby den übergebenen Block in ein <i>Proc</i> (ein Funktions-Objekt) um. Alternativ können Procs auch manuell durch die Schlüsselworte <i>proc</i>, <i>lambda</i> und <i>-&gt;</i> angelegt werden. Aufgerufen werde diese Objekte durch die Methoden <i>call</i>, <i>[]</i> oder <i>.()</i>. Da Ruby runde Klammern lediglich zum Gruppieren nutzt, können Procs nicht (wie in anderen Programmiersprachen üblich) mit <code>proc_name()</code> aufgerufen werden.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">mache_block_zu_proc</span><span class="w"> </span><span class="o">&amp;</span><span class="n">block</span>
<span class="w"> </span><span class="n">block</span><span class="w"> </span><span class="c1"># ist der Rückgabewert, da letzter Ausdruck</span>
<span class="k">end</span>
<span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mache_block_zu_proc</span><span class="p">{</span><span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="p">}</span>
<span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">proc</span><span class="w"> </span><span class="p">{</span><span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">b</span><span class="p">}</span><span class="w"> </span><span class="c1"># ein return innerhalb des Blocks verlässt die beinhaltende Methode, break nur den Block</span>
<span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">lambda</span><span class="w"> </span><span class="p">{</span><span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">}</span><span class="w"> </span><span class="c1"># wie proc, aber return innerhalb des lambdas verlässt nur diesen Block</span>
<span class="n">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="n">a</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">b</span><span class="p">}</span><span class="w"> </span><span class="c1"># neue Schreibweise für lambda, runde Klammern sind optional</span>
<span class="n">a</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; 3</span>
<span class="n">b</span><span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="o">]</span><span class="w"> </span><span class="c1"># =&gt; -1</span>
<span class="n">c</span><span class="o">.</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; 2</span>

<span class="c1"># Beispiel für funktionale Programmierung</span>
<span class="n">e</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">d</span><span class="o">.</span><span class="n">curry</span><span class="o">.</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span><span class="w"> </span><span class="c1"># neues Proc das den (oder die) ersten Parameter (den Dividenden hier) als 8 setzt</span>
<span class="n">e</span><span class="o">.</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; 4</span>
<span class="c1"># mit &amp; können Proc-Objekte (eigentlich jede Klasse, die eine "call"-Methode hat) wieder in Blöcke umgewandelt werden</span>
<span class="o">[</span><span class="mi">8</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="o">].</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="c1"># =&gt; [1, 2, 4, 8]</span>
</pre></div>
<p>Alle Blöcke sind <a href="Closure_(Funktion)" title="Closure (Funktion)">Closures</a>, sie speichern also z.&nbsp;B. den Zustand lokaler Variablen, wenn sie innerhalb des Blocks dauerhaft benötigt werden.
</p>
<div class="mw-heading mw-heading3"><h3 id="Mixins">Mixins</h3></div>
<p>Ruby beherrscht bewusst keine Mehrfachvererbung, bietet stattdessen aber ein Konzept namens <a href="Mixin" title="Mixin">Mixin</a> (deutsch: Beimischung). Mixins sind Sammlungen von Methoden, die beliebigen Klassen <i>beigemischt</i> werden können. Eine Klasse kann beliebig viele Mixins beinhalten. Mixins werden in der Vererbungshierarchie zwischen Klasse und Superklasse in der Reihenfolge eingehängt, in der sie geschrieben wurden. Alternativ ist es auch möglich, Mixins vor die eigentliche Klasse zu hängen (u.&nbsp;a. hilfreich für <a href="Aspektorientierte_Programmierung" title="Aspektorientierte Programmierung">Aspektorientierte Programmierung</a>). Um Mixins zu definieren, werden in Ruby Module benutzt, das sind quasi Klassen (d.&nbsp;h. Sammlungen von Methoden) die nicht instanziiert werden können und <a href="Namensraum" title="Namensraum">Namensräume</a> in einem.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Tier</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">sagt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2"> sagt nichts"</span><span class="w"> </span><span class="c1"># "text#{logik}text" ist Rubys Textinterpolation</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="k">module</span><span class="w"> </span><span class="nn">KannSchwimmen</span><span class="w"> </span><span class="c1"># Module, d. h. KannSchwimmen.new geht nicht</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">schwimmt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2"> schwimmt"</span><span class="w"> </span><span class="c1"># self gibt die Instanz zurück,</span>
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="c1"># jedes Objekt hat eine Methode .class, die das Klassenobjekt zurückgibt</span>
<span class="k">end</span>

<span class="k">module</span><span class="w"> </span><span class="nn">KannNichtSchwimmen</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">schwimmt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2"> geht unter"</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Fisch</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">Tier</span><span class="w"> </span><span class="c1"># Vererbung wird durch den Kleiner-Als-Operator gekennzeichnet</span>
<span class="w"> </span><span class="kp">include</span><span class="w"> </span><span class="no">KannSchwimmen</span><span class="w"> </span><span class="c1"># füge KannSchwimmen zwischen Fisch und Tier ein</span>
<span class="k">end</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Vogel</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">Tier</span>
<span class="w"> </span><span class="kp">include</span><span class="w"> </span><span class="no">KannNichtSchwimmen</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">sagt</span><span class="w"> </span><span class="c1"># übliches Vererben, überdecke sagt-Methode von Tier</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">: Piep"</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="k">class</span><span class="w"> </span><span class="nc">Mensch</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">Tier</span>
<span class="w"> </span><span class="kp">include</span><span class="w"> </span><span class="no">KannSchwimmen</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">sagt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">: Ich kann mich besser ausdrücken"</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="k">class</span><span class="w"> </span><span class="nc">NichtSchwimmer</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">Mensch</span>
<span class="w"> </span><span class="n">prepend</span><span class="w"> </span><span class="no">KannNichtSchwimmen</span><span class="w"> </span><span class="c1"># hänge KannNichtSchwimmen vor NichtSchwimmer ein,</span>
<span class="k">end</span><span class="w"> </span><span class="c1"># dh, überdecke die schwimmt-Methode</span>

<span class="n">fisch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Fisch</span><span class="o">.</span><span class="n">new</span>
<span class="n">mensch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Mensch</span><span class="o">.</span><span class="n">new</span>
<span class="n">vogel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Vogel</span><span class="o">.</span><span class="n">new</span>
<span class="n">nicht_schwimmer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">NichtSchwimmer</span><span class="o">.</span><span class="n">new</span>

<span class="n">fisch</span><span class="o">.</span><span class="n">sagt</span><span class="w"> </span><span class="c1"># =&gt; Fisch sagt nichts</span>
<span class="n">vogel</span><span class="o">.</span><span class="n">sagt</span><span class="w"> </span><span class="c1"># =&gt; Vogel: Piep</span>
<span class="n">mensch</span><span class="o">.</span><span class="n">sagt</span><span class="w"> </span><span class="c1"># =&gt; Mensch: Ich kann mich besser ausdrücken</span>
<span class="n">nicht_schwimmer</span><span class="o">.</span><span class="n">sagt</span><span class="w"> </span><span class="c1"># =&gt; NichtSchwimmer: Ich kann mich besser ausdrücken</span>
<span class="nb">puts</span>
<span class="n">fisch</span><span class="o">.</span><span class="n">schwimmt</span><span class="w"> </span><span class="c1"># =&gt; Fisch schwimmt</span>
<span class="n">vogel</span><span class="o">.</span><span class="n">schwimmt</span><span class="w"> </span><span class="c1"># =&gt; Vogel geht unter</span>
<span class="n">mensch</span><span class="o">.</span><span class="n">schwimmt</span><span class="w"> </span><span class="c1"># =&gt; Mensch schwimmt</span>
<span class="n">nicht_schwimmer</span><span class="o">.</span><span class="n">schwimmt</span><span class="w"> </span><span class="c1"># =&gt; NichtSchwimmer geht unter</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Offene_Klassen">Offene Klassen</h4></div>
<p>In Ruby sind alle Klassen offen, das heißt sämtliche Methoden können im späteren Programmverlauf ausgetauscht werden. Das gilt auch für alle ruby-internen Klassen. Um Methoden zu überschreiben, muss lediglich eine neue Klasse mit demselben Namen wie die zu überschreibende Klasse angelegt werden. Ruby tauscht dann die neu definierten Methoden aus oder fügt sie hinzu. Diese Technik ist sehr mächtig, ermöglicht aber auch schwer auffindbare Fehler, besonders in größeren Projekten. Aus diesem Grund wird sie auch leicht abwertend <i>Monkey-Patching</i> genannt. Etwas Abhilfe zu den auftretenden Problemen schaffen <i>Refinements</i>, eine Möglichkeit die Überschreibungen lokal einzuschränken. Die zuvor vorgestellte Methode, Module den gewünschten Klassen vorzuhängen <i>(prepend)</i>, ist meist die sichere Variante (und bietet außerdem die Möglichkeit die überdeckte Methode direkt aufzurufen).
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Numeric</span><span class="w"> </span><span class="c1"># ruby-interne Klasse</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">inverse</span><span class="w"> </span><span class="c1"># neue Methode, berechne den Kehrwert</span>
<span class="w"> </span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nb">self</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="mi">5</span><span class="o">.</span><span class="n">inverse</span><span class="w"> </span><span class="c1"># =&gt; 0.2</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Domänenspezifische_Sprache"><span id="Dom.C3.A4nenspezifische_Sprache"></span>Domänenspezifische Sprache</h3></div>
<p>Ruby wird gerne benutzt zum Erzeugen von <a href="Dom%C3%A4nenspezifische_Sprache" title="Domänenspezifische Sprache">domänenspezifischen Sprachen</a>. Das sind Textbausteine, die weniger wie Programmcode aussehen, sondern mehr wie eine <a href="Auszeichnungssprache" title="Auszeichnungssprache">Auszeichnungssprache</a>, in Wirklichkeit aber normaler Ruby-Code sind. Möglich macht das zum einen die flexible Schreibweise von Ruby, bspw. sind Klammern hinter Methodenaufrufen oder Semikola am Ende der Zeile optional. Zum anderen bietet Ruby viele Möglichkeiten zur <a href="Metaprogrammierung" title="Metaprogrammierung">Metaprogrammierung</a>, die es möglich machen, redundante Ausdrücke verschwinden zu lassen und hinter den Kulissen das Programm zu verändern. Hier als Beispiel die Konfiguration einer Testfabrik für <i>FactoryBot</i>:
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="no">FactoryBot</span><span class="o">.</span><span class="n">define</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">factory</span><span class="w"> </span><span class="ss">:user</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">first_name</span><span class="w"> </span><span class="s2">"Max"</span>
<span class="w"> </span><span class="n">last_name</span><span class="w"> </span><span class="s2">"Mustermann"</span>
<span class="w"> </span><span class="n">admin</span><span class="w"> </span><span class="kp">false</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="n">factory</span><span class="w"> </span><span class="ss">:admin</span><span class="p">,</span><span class="w"> </span><span class="ss">class</span><span class="p">:</span><span class="w"> </span><span class="no">User</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">first_name</span><span class="w"> </span><span class="s2">"Admin"</span>
<span class="w"> </span><span class="n">last_name</span><span class="w"> </span><span class="s2">"Root"</span>
<span class="w"> </span><span class="n">admin</span><span class="w"> </span><span class="kp">true</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Mächtige_Standardbibliothek"><span id="M.C3.A4chtige_Standardbibliothek"></span>Mächtige Standardbibliothek</h3></div>
<p>Die Kern-Klassen (String, Integer, Float, Array, Hash, Range, Regexp) bringen eine Fülle an Methoden mit, die in jedem Rubyprogramm sofort verwendet werden können. Insbesondere durch die häufige Nutzung von Blöcken können mit diesen Methoden lange Programme auf wenige Zeilen reduziert werden, weshalb sich Ruby gut zum Zeigen von <a href="Proof_of_Concept" title="Proof of Concept">Proof of Concepts</a> eignet. Bemerkenswert ist das Modul <i>Enumerable</i>, welches viele Konzepte der funktionalen Programmierung direkt in den Ruby-Kern bringt. <i>Enumerable</i> kann in jedes Objekt eingebunden werden, welches einen iterierbaren Container darstellt und die Methode <i>each</i> implementiert, bspw. die Klassen Array, Hash und Range. For-Schleifen sind in Ruby deshalb meist unnötig. Die im Folgenden gezeigten Methoden <i>reduce</i>, <i>count</i>, <i>sort_by</i>, <i>each_slice</i> und <i>map</i> sind alles Methoden aus <i>Enumerable</i> und können somit selbst erstellten Klassen leicht hinzugefügt werden.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="c1"># summiere die zahlen 1 bis 100 (ohne Summenformel), reduce entspricht fold aus der funktionalen Programmierung</span>
<span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">100</span><span class="p">)</span><span class="o">.</span><span class="n">reduce</span><span class="p">{</span><span class="o">|</span><span class="n">counter</span><span class="p">,</span><span class="n">number</span><span class="o">|</span><span class="w"> </span><span class="n">counter</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">number</span><span class="p">}</span><span class="w"> </span><span class="c1"># (1..100).sum geht auch</span>
<span class="c1"># Array aus den Zahlen von 0 bis 30 in 5er Schritten</span>
<span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="mi">30</span><span class="p">)</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">to_a</span>
<span class="c1"># Anzahl der Zeilen einer Datei die leer sind (ohne die Datei komplett in den Arbeitsspeicher zu laden)</span>
<span class="no">IO</span><span class="o">.</span><span class="n">foreach</span><span class="p">(</span><span class="s2">"Dateiname"</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">{</span><span class="o">|</span><span class="n">line</span><span class="o">|</span><span class="w"> </span><span class="n">line</span><span class="w"> </span><span class="o">=~</span> <span class="sr">/^\s*$/</span><span class="p">}</span>
<span class="c1"># Sortiere Array nach Länge der Nachnamen</span>
<span class="o">[</span><span class="s2">"Max Mustermann"</span><span class="p">,</span><span class="w"> </span><span class="s2">"John Doe"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tarou Yamada"</span><span class="o">].</span><span class="n">sort_by</span><span class="p">{</span><span class="o">|</span><span class="nb">name</span><span class="o">|</span><span class="w"> </span><span class="nb">name</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">length</span><span class="p">}</span>
<span class="c1"># Schreibe jedes dritte Wort im Satz in Großbuchstaben</span>
<span class="s2">"Franz jagt im komplett verwahrlosten Taxi quer durch Bayern."</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">each_slice</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">drei_wörter</span><span class="o">|</span><span class="w"> </span><span class="n">drei_wörter</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">upcase!</span><span class="p">;</span><span class="w"> </span><span class="n">drei_wörter</span><span class="p">}</span><span class="o">.</span><span class="n">flatten</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">" "</span><span class="p">)</span>
</pre></div>
<p>Zusätzlich zu den integrierten Modulen wird Ruby standardmäßig mit vielen Modulen ausgeliefert. Bspw. sind Unterstützung für <a href="JSON" title="JSON">JSON</a>, <a href="YAML" title="YAML">YAML</a>, <a href="HTTP" class="mw-redirect" title="HTTP">HTTP</a>, Benchmarks, Primzahlen, sichere Zufallszahlen, <a href="OpenSSL" title="OpenSSL">OpenSSL</a> und Logging sofort vorhanden.
</p>
<div class="mw-heading mw-heading3"><h3 id="Metaprogrammierung">Metaprogrammierung</h3></div>
<p>Ruby bietet weitreichende Möglichkeiten zu <a href="Metaprogrammierung" title="Metaprogrammierung">Metaprogrammierung</a> an. Damit ist es z.&nbsp;B. möglich, Methoden zu generieren, Instanzvariablen auszutauschen, die Vererbungshierarchie zu verändern oder Konstanten zu bearbeiten. Die Syntax zu verändern oder weitere Operatoren hinzuzufügen geht allerdings nicht. Hier sei als Beispiel eine Methode aufgeführt, Setter und Getter automatisch zu erzeugen (unter den Namen <i>attr_reader</i>, <i>attr_writer</i>, <i>attr_accessor</i> bereits im Standard enthalten).
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span><span class="w"> </span><span class="nc">Object</span><span class="w"> </span><span class="c1"># Monkey-Patching aller Klassen</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nc">self</span><span class="o">.</span><span class="nf">getter</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="w"> </span><span class="c1"># self ist hier Object, es wird eine Klassenmethode erzeugt</span>
<span class="w"> </span><span class="n">args</span><span class="o">.</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">arg</span><span class="o">|</span><span class="w"> </span><span class="c1"># es wird durch alle Parameter iteriert</span>
<span class="w"> </span><span class="n">define_method</span><span class="w"> </span><span class="n">arg</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="c1"># define_method(arg){block} erzeugt eine neue Methode des Namens arg mit dem Inhalt block</span>
<span class="w"> </span><span class="nb">instance_variable_get</span><span class="p">(</span><span class="s2">"@</span><span class="si">#{</span><span class="n">arg</span><span class="si">}</span><span class="s2">"</span><span class="o">.</span><span class="n">to_sym</span><span class="p">)</span><span class="w"> </span><span class="c1"># instance_variable get gibt den Wert der Instanzvariablen des übergeben Namens zurück</span>
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="c1"># \- "@#{arg}" hängt ein @ vor den Inhalt von arg, to_sym wandelt den String um in ein Symbol</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nc">self</span><span class="o">.</span><span class="nf">setter</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="w"> </span><span class="c1"># *args packt alle Parameter in ein Array namens args</span>
<span class="w"> </span><span class="n">args</span><span class="o">.</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">arg</span><span class="o">|</span>
<span class="w"> </span><span class="n">define_method</span><span class="w"> </span><span class="ss">:"</span><span class="si">#{</span><span class="n">arg</span><span class="si">}</span><span class="ss">="</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">new_value</span><span class="o">|</span><span class="w"> </span><span class="c1"># define_method übergibt dem Block die übergeben Parameter</span>
<span class="w"> </span><span class="nb">instance_variable_set</span><span class="p">(</span><span class="s2">"@</span><span class="si">#{</span><span class="n">arg</span><span class="si">}</span><span class="s2">"</span><span class="o">.</span><span class="n">to_sym</span><span class="p">,</span><span class="w"> </span><span class="n">new_value</span><span class="p">)</span><span class="w"> </span><span class="c1"># \- setter-methoden enden mit einem =</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>

<span class="k">class</span><span class="w"> </span><span class="nc">PaarMit2</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="w"> </span><span class="n">links</span><span class="w"> </span><span class="c1"># Konstruktor</span>
<span class="w"> </span><span class="vi">@links</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">links</span><span class="w"> </span><span class="c1"># Instanzvariablen werden bei Erwähnung in einer beliebigen Methode automatisch erzeugt.</span>
<span class="w"> </span><span class="vi">@rechts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="n">getter</span><span class="w"> </span><span class="ss">:links</span><span class="p">,</span><span class="w"> </span><span class="ss">:rechts</span>
<span class="w"> </span><span class="n">setter</span><span class="w"> </span><span class="ss">:links</span>
<span class="k">end</span>

<span class="n">paar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">PaarMit2</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span><span class="w"> </span><span class="c1"># new ruft immer den Konstruktor auf</span>
<span class="n">paar</span><span class="o">.</span><span class="n">links</span><span class="w"> </span><span class="c1"># =&gt; 4</span>
<span class="n">paar</span><span class="o">.</span><span class="n">rechts</span><span class="w"> </span><span class="c1"># =&gt; 2</span>
<span class="n">paar</span><span class="o">.</span><span class="n">links</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">9</span><span class="w"> </span><span class="c1"># =&gt; 9</span>
<span class="n">paar</span><span class="o">.</span><span class="n">links</span><span class="w"> </span><span class="c1"># =&gt; 9</span>
<span class="n">paar</span><span class="o">.</span><span class="n">rechts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">8</span><span class="w"> </span><span class="c1"># =&gt; Fehler: NoMethodError (undefined method `rechts=')</span>
</pre></div>
<p>Diese Techniken eignen sich auch gut zum Debuggen von Anwendungen oder zum Analysieren schlecht dokumentierter Anwendungen oder Bibliotheken. Bspw. antwortet jedes Objekt beim Aufruf der Methode <code>methods</code> mit einer Liste aller seiner Methoden, <code>instance_variables</code> gibt eine Liste aller Instanzvariablen zurück.
</p>
<div class="mw-heading mw-heading3"><h3 id="Integration_in_Unix">Integration in Unix</h3></div>
<p>Ruby bietet sich, ähnlich wie <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>, an, direkt in die <a href="Pipe_(Informatik)#Unix" title="Pipe (Informatik)">Pipeline</a> der Unix-Shell integriert zu werden. Möglich machen das Kommandozeilenparameter des Rubyinterpreters, mit denen man Programmlogik und übliches Programmverhalten definieren kann (üblicherweise die gleiche Operation auf jede Zeile anzuwenden). Ruby erweitert die Standard-Unixwerkzeuge mit fortgeschrittenen Methoden zur Textanalyse und Textverarbeitung.
</p><p>Weiterhin bietet Ruby auch die Möglichkeit, innerhalb eines Programms bequem Prozesse zu starten, deren Eingabe zu steuern und Ausgabe und Rückgabewerte auszulesen. Code innerhalb <i>``</i> wird direkt an die Unix-Shell übergeben. Bspw. speichert der Befehl <code>os_string = `uname -a`</code> den Betriebssystemnamen direkt in eine Rubyvariablen. Der Rückgabewert des letzten Programmaufrufs wird analog zur Shell automatisch in der globalen Variablen <code>$?</code> gespeichert. Auch Signalbehandlung, Sockets und Threads werden ohne zusätzliche Bibliotheken direkt vom Sprachkern unterstützt. Zum Beschleunigen der Verarbeitung gibt es in Ruby ein Modul namens <i>FileUtils</i>, das viel der Funktionalität vieler Unix-Dateiverwaltungsprogramme (<i>rm</i>, <i>cp</i>, <i>chmod</i>) direkt in Ruby abbildet.
</p>
<div class="mw-heading mw-heading3"><h3 id="Syntax_und_Grundlagen">Syntax und Grundlagen</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Namenskonvention">Namenskonvention</h4></div>
<p>Ruby folgt der üblichen Konvention für Methoden- und Variablennamen, ein Name muss mit einem Kleinbuchstaben oder Unterstrich beginnen, dann dürfen beliebige Buchstaben (nach <a href="Unicode" title="Unicode">Unicode</a>), Ziffern und Unterstriche folgen. Methoden dürfen zusätzlich mit einem Ausrufe- oder Fragezeichen enden. Nach der üblichen Konvention dient Ersteres als Hinweis, dass diese Methode eine schärfere Version der gleichen Methode ohne Ausrufezeichen ist (verändert den Zustand des Objekts, wirft Fehler, …), Letzteres bedeutet, dass die Funktion ein <i>Boolean</i> zurückgibt (true oder false). Fängt ein Variablenname mit einem Großbuchstaben an, so ist es eine Konstante. Variablen können zusätzlich mit einem Sonderzeichen anfangen, welches den Gültigkeitsbereich beschreibt.
</p>
<div class="mw-heading mw-heading4"><h4 id="Variablenbezeichner">Variablenbezeichner</h4></div>
<p>Ruby unterscheidet fünf Gültigkeitsbereiche:
</p>
<ul><li>Normalerweise ist eine Variable lokal innerhalb des umgebenden Blocks oder der umgebenden Methode gültig.</li>
<li>Ein <code>@</code> vor Variablen deklariert Instanzvariable, sie werden dann dauerhaft der <a href="Objekt_(Programmierung)" title="Objekt (Programmierung)">Instanz</a> zugeordnet und sind nur in dieser sichtbar. Auf Instanzvariablen kann von außen nur über Methoden zugegriffen werden. Zugriff auf nicht vorhandene Instanzvariablen werfen keinen Fehler, sondern geben <i>nil</i> zurück</li>
<li>Ein vorangestelltes <code>@@</code> macht Variablen zu Klassenvariablen, die zur umgebenden Klasse gehören.</li>
<li>Mit <code>$</code> werden Variablen global und sind damit im gesamten Programm sichtbar.</li>
<li>Der Gültigkeitsbereich für Konstanten richtet sich nach der lokalen Verschachtelungstiefe und kann mit <code>::</code> spezifiziert werden</li></ul>
<div class="mw-heading mw-heading4"><h4 id="Methodenaufrufe_und_Ausdrücke"><span id="Methodenaufrufe_und_Ausdr.C3.BCcke"></span>Methodenaufrufe und Ausdrücke</h4></div>
<p>In Ruby werden Methodenaufrufe nicht zwingend mit nachfolgenden Klammern gekennzeichnet. <code>gets.chomp</code> ist also äquivalent zu <code>gets().chomp()</code>. Wenn Methoden Parameter benötigen, müssen diese in Klammern gesetzt werden, wenn auf dem Ergebnis eine weitere Operation ausgeführt werden soll. <code>"a,b,c".split ","</code>ist ok, <code>"a,b,c".split(",").join(" ")</code> benötigt aber zwingend das erste Klammernpaar. Da Klammern auch zur Gruppierung eingesetzt werden, sollte bei erwünschtem Methodenaufruf niemals ein Leerzeichen zwischen Methodenname und Klammer gesetzt werden. So wird <code>[1,2].join␣("|") * 2</code> als <code>[1,2].join(("|") * 2)</code> interpretiert, mit dem Ergebnis <code>"1||2"</code>. <code>[1,2].join("|") * 2</code> hingegen wird als <code>([1,2].join("|")) * 2</code>interpretiert, und hat damit das Ergebnis <code>"1|21|2"</code>.
</p><p>Jede Anweisung bildet einen Ausdruck, der einer Variablen zugewiesen werden kann. Einzelne Anweisungen werden durch Zeilenumbrüche oder Semikolons getrennt. Der letzte Ausdruck innerhalb einer Methode bildet automatisch deren Rückgabewert. Es kann aber auch schon vorher mit Schlüsselwort <i>return</i> frühzeitig zurückgesprungen werden.
</p>
<div class="mw-heading mw-heading4"><h4 id="Datentypen">Datentypen</h4></div>
<p>Die elementaren Datentypen besitzen bequemere Konstruktoren als das übliche <code>Klasse.new</code>
</p>
<ul><li>String: <code>"Text"</code>, <code>'Text'</code> oder <code>%{Text}</code> <i>Text</i></li>
<li>Integer: <code>3</code> (Zehnersystem), <code>0775</code> oder <code>0o775</code> (Oktalsystem), <code>0xFF</code> (Hexadezimalsystem) <code>0b1001</code> (Binärsystem) <i>Ganzzahl (unbeschränkte Größe)</i></li>
<li>Float: <code>3.0</code> <i>Fließkommazahl (beschränkte Genauigkeit)</i></li>
<li>Rational: <code>1/2r</code> <i>Rationale Zahl</i></li>
<li>Complex: <code>1 + 1i</code> <i>Komplexe Zahl</i></li>
<li>Array: <code>[1,2,3]</code> <i>Auflistung, kann beliebige verschiedene Datentypen enthalten</i></li>
<li>Hash: <code>{ 1 =&gt; "eins", 2 =&gt; "zwei" }</code> <i>Zuordnung, ordnet jedem Wert vor den Pfeilen (Schlüssel) genau einen Wert zu</i></li>
<li>Regexp: <code>/\A(eins|zwei)\z/</code> oder <code>%r{\A(eins|zwei)\z}</code> <i><a href="Regul%C3%A4rer_Ausdruck" title="Regulärer Ausdruck">Regulärer Ausdruck</a></i></li>
<li>Range: <code>1..3</code> oder <code>1...4</code> (rechtes Element ausschließend) <i>Intervall</i></li>
<li>Symbol: <code>:zeichen</code> <i>Symbol, siehe unten</i></li></ul>
<div class="mw-heading mw-heading4"><h4 id="Dynamische_Strings">Dynamische Strings</h4></div>
<p>Zeichenketten sind in Ruby standardmäßig veränderbar, d.&nbsp;h., ein String-Objekt kann seinen Wert zur Laufzeit verändern. <code>text = "Felar"; text[2..3] = "hle"; puts text</code> verändert den Wert von <code>text</code> direkt (und gibt <i>Fehler</i> aus). Viele String-Methoden gibt es sowohl in einer verändernden Variante und in einer Variante, die ein neues String-Objekt erzeugt.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"ABC"</span>
<span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="o">.</span><span class="n">downcase</span>
<span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="c1"># =&gt; ABC abc</span>
<span class="n">a</span><span class="o">.</span><span class="n">downcase!</span>
<span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="c1"># =&gt; abc abc</span>
</pre></div>
<p>Strings können wie jedes Ruby-Objekt durch Aufruf der Methode <code>freeze</code> eingefroren werden (bspw. <code>"ABC".freeze</code>) und sind danach unveränderbar.
</p>
<div class="mw-heading mw-heading4"><h4 id="Symbole">Symbole</h4></div>
<p>Dieser etwas ungewöhnliche und auch umstrittene Datentyp ist in eine Art Mischung aus Integer und String. Er dient primär als Merkhilfe für Schlüssel von Hashes, da hier dynamische Strings unpraktisch sind und Integer wenig Speicher benötigen. Symbole besitzen die Textmanipulationsmethoden von String nicht, können aber jederzeit in Strings umgewandelt werden. Werden Symbole in Hashes als Schlüssel verwendet, kann eine vereinfachte Schreibweise verwendet werden. Statt <code>{ :a =&gt; 1, :b =&gt; 2 }</code> kann auch <code>{ a: 1, b: 2 }</code> geschrieben werden. Ruby-intern werden Symbole auch häufig verwendet, so können Methoden auch mit ihrem Symbolnamen aufgerufen werden: <code>1 &lt; 4</code> kann auch als <code>1.send(:&lt;, 4)</code> geschrieben werden. Einfache Blöcke, die nur eine Methode des übergebenen Objekts aufrufen, können mit Symbolen vereinfacht geschrieben werden, wobei das Symbol die aufzurufende Methode bezeichnet. <code>[1,2,3].map{|i| i.to_s}</code> kann auch als <code>[1,2,3].map(&amp;:to_s)</code> geschrieben werden (&amp; wandelt das Symbol in einen Block um).
</p>
<div class="mw-heading mw-heading4"><h4 id="Wahrheitswerte">Wahrheitswerte</h4></div>
<p>In Ruby gibt es drei verschiedene Wahrheitswerte, <code>true</code>, <code>false</code> und <code>nil</code>. Nil steht hierbei für ein fehlendes Ergebnis und wird wie false als <i>Falsch</i> ausgewertet. True und <b>alle</b> anderen Objekte werden als <i>Wahr</i> ausgewertet. <code>puts "Ja!" if 0</code> evaluiert also zu <i>Wahr</i>, „Ja!“ wird ausgegeben.
</p>
<div class="mw-heading mw-heading4"><h4 id="Fehlerbehandlung">Fehlerbehandlung</h4></div>
<p>In den meisten Programmiersprachen muss der auf Fehler zu überprüfende Programmteil explizit markiert werden (meist durch die Schlüsselwörter <i>try</i> und <i>catch</i>), in Ruby muss für die üblichsten Fälle (der Programmteil umfasst die gesamte Methode oder den gesamten Block) kein eigener Bereich markiert werden. Wenn eine Abgrenzung erforderlich sein sollte, kann der Bereich mit <i>begin</i> und <i>end</i> markiert werden.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="k">def</span><span class="w"> </span><span class="nf">gib_summe_aus</span><span class="w"> </span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="n">arg2</span>
<span class="w"> </span><span class="c1"># Methodenlogik</span>
<span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">arg1</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Numeric</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">arg2</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Numeric</span><span class="p">)</span>
<span class="w"> </span><span class="k">raise</span><span class="w"> </span><span class="no">ArgumentError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">"Bitte nur Zahlen eingeben"</span><span class="p">)</span><span class="w"> </span><span class="c1"># raise wirft Fehler</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">arg1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">arg2</span>
<span class="k">rescue</span><span class="w"> </span><span class="no">ArgumentError</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="c1"># Fange ArgumentError ab</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Es ist ein Fehler bei der Parameterübergabe aufgetreten"</span>
<span class="k">rescue</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="c1"># Fange alle weiteren Fehler ab</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">e</span><span class="o">.</span><span class="n">message</span>
<span class="k">ensure</span><span class="w"> </span><span class="c1"># wird auf jeden Fall ausgeführt</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s1">'Methodenende'</span>
<span class="k">end</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Alternative_Bedingungen_/_Schleifen"><span id="Alternative_Bedingungen_.2F_Schleifen"></span>Alternative Bedingungen / Schleifen</h4></div>
<p>Bedingungen und Schleifen bieten sowohl eine Postfixnotation als auch ein eigenes Schlüsselwort für das Inverse (inspiriert von <a href="Perl_(Programmiersprache)" title="Perl (Programmiersprache)">Perl</a>).
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span>
<span class="k">if</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="k">end</span>
<span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="c1"># Suffixform</span>
<span class="k">unless</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="c1"># Invers</span>
<span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="c1"># Invers + Suffixform</span>

<span class="k">while</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="k">end</span>
<span class="p">(</span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="n">a</span><span class="o">+=</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="c1"># Suffixform</span>
<span class="k">until</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">30</span><span class="p">;</span><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="c1"># Invers</span>
<span class="p">(</span><span class="nb">puts</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+=</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="k">until</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="mi">40</span><span class="w"> </span><span class="c1"># Invers + Suffixform</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Reguläre_Ausdrücke"><span id="Regul.C3.A4re_Ausdr.C3.BCcke"></span>Reguläre Ausdrücke</h4></div>
<p>Reguläre Ausdrücke sind in Ruby direkt im Sprachkern enthalten. Ruby benutzt eine eigene Regex-Engine namens <i>Onigmo</i>, deren Syntax und Funktionsumfang zum größten Teil kompatibel mit <a href="PCRE" class="mw-redirect" title="PCRE">PCRE</a> ist. Zusätzlich ist es möglich, Rubyvariablen direkt in reguläre Ausdrücke zu interpolieren und beliebige Programmlogik durch Blöcke beim Suchen und Ersetzen zu verwenden. Bspw. addiert folgender Befehl alle Zahlen in einem Text um eins: <code>puts "test, 1, 2, 3".gsub(/(\d+)/){|zahl| zahl.to_i + 1} # =&gt; test, 2, 3, 4</code>
</p>
<div class="mw-heading mw-heading4"><h4 id="Konstanten">Konstanten</h4></div>
<p>Konstanten sind in Ruby alle Variablen, die mit einem Großbuchstaben anfangen. Alle Klassen und Module sind somit Konstanten. Das Besondere an Konstanten in Ruby ist ihre Verschachtelung. Konstanten innerhalb von Konstanten können mittels <code>::</code> aufgerufen werden und unterliegen keinen Zugriffsrechten (wie etwa Methoden oder Instanzvariablen). Deswegen können Module als Namensräume benutzt werden, alle Variablen bleiben darin versteckt, auf alle Konstanten (wie bspw. Klassen) kann über den Modulnamen qualifiziert zugegriffen werden (bspw. <code>MeinModul::MeineKlasse.new</code>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Bestandteile">Bestandteile</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Interaktive_Ruby-Shell">Interaktive Ruby-Shell</h3></div>
<p><a href="Interactive_Ruby_Shell" title="Interactive Ruby Shell"><b>Interactive Ruby</b> (<b>irb</b>)</a> ist eine <a href="Kommandozeileninterpreter" title="Kommandozeileninterpreter">Read-Eval-Print Loop</a> (REPL), mit welcher der Anwender interaktiv Ruby programmieren kann. Irb wird mit dem Ruby-Interpreter ausgeliefert und kann zum Analysieren und Testen eingesetzt werden:
</p>
<div class="mw-highlight mw-highlight-lang-irb mw-content-ltr" dir="ltr"><pre><span></span><span class="gp">irb(main):001:0&gt; </span><span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span>
<span class="go">=&gt; 24</span>
<span class="gp">irb(main):002:0&gt; </span><span class="p">((</span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">reverse</span>
<span class="go">=&gt; "42"</span>
<span class="gp">irb(main):003:0&gt; </span><span class="s2">"Ein Beispielstring"</span><span class="o">.</span><span class="n">size</span>
<span class="go">=&gt; 18</span>
</pre></div>
<p>Als Alternative zu Irb gibt es <b>Pry</b>, eine REPL, welche weitaus tiefgreifendere Möglichkeiten zur <a href="Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Introspektion</a> und zum <a href="Debugger" title="Debugger">Debuggen</a> mitbringt.
</p>
<div class="mw-heading mw-heading3"><h3 id="RDoc_und_ri">RDoc und ri</h3></div>
<p>RDoc ist ein <a href="Software-Dokumentationswerkzeug" title="Software-Dokumentationswerkzeug">Software-Dokumentationswerkzeug</a>, welches aus Ruby- und C-Quelltexten automatisch <a href="Hypertext_Markup_Language" title="Hypertext Markup Language">HTML</a>-Dokumentationsdateien erstellt. Weiterhin wird eine Datenbank aufgebaut, die mit dem Tool ri durchsucht werden kann. RDoc und ri sind Bestandteil der Standarddistribution und werden zusammen mit dem Interpreter ausgeliefert.
</p>
<div class="mw-heading mw-heading3"><h3 id="Rake">Rake</h3></div>
<p><a href="Rake_(Software)" title="Rake (Software)">Rake</a> steht für Ruby-Make und ist eine Alternative zu <a href="Make" title="Make">Make</a> aus <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>. Da es in Ruby keine Kompilationsphase gibt, dienen Rakefiles zum Automatisieren repetitiver Aufgaben, bspw. dem Generieren von Dokumentation, dem Upload von Dateien oder dem Packen von Projekten. Rake kann wie Make Abhängigkeiten auflösen, wenn für Aufgabe B erst Aufgabe A erfüllt sein muss, so führt Rake automatisch Aufgabe A aus. Rake ist eine <a class="mw-selflink-fragment" href="#Domänenspezifische_Sprache">domänenspezifische Sprache</a>, d.&nbsp;h., es lässt sich bequem wie eine Auszeichnungssprache lesen, bietet aber die vollen Möglichkeiten die Ruby bietet.
</p>
<div class="mw-heading mw-heading3"><h3 id="Paketverwaltung">Paketverwaltung</h3></div>
<p>Ruby-Bibliotheken werden üblicherweise als <a href="RubyGems" title="RubyGems">Gems (RubyGems)</a> gepackt und auf rubygems.org, dem zentralen Gem-Register, veröffentlicht. RubyGems löst bei der Installation oder bei Updates die im Paket angegebenen Abhängigkeiten eigenständig rekursiv auf und bietet dabei sogar die Möglichkeit Pakete gleichzeitig in unterschiedlichen Versionen bereitzustellen. Seit Ruby 1.9 ist Rubygems Bestandteil der Standardbibliothek von Ruby. Heute wird es meist zusammen mit Bundler benutzt (ebenfalls Teil der Standardbibliothek, seit Ruby 2.6), einem Programm welches Schnappschüsse aus einer Kollektion von Gems erstellt und diese Anordnung auf anderen Maschinen (oder andern Projektordnern) wiederherstellen kann.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implementierungen">Implementierungen</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Referenzimplementierung">Referenzimplementierung</h3></div>
<p>Die Referenzimplementierung von Ruby wurde von Yukihiro „Matz“ Matsumoto als <a href="Interpreter" title="Interpreter">Interpreter</a> in C entworfen. Dieser wird meist als <b>MRI</b> <i>(Matz’s Ruby Interpreter)</i> oder auch als <b>CRuby</b> bezeichnet und ist derzeit am weitesten verbreitet. Den Kern bildet <b><a href="YARV" title="YARV">YARV</a></b> <i>(Yet Another Ruby VM)</i>, eine <a href="Virtuelle_Maschine" title="Virtuelle Maschine">virtuelle Maschine</a>. Statt ein Rubyprogramm direkt auszuführen, wird es zunächst in <a href="Bytecode" title="Bytecode">Bytecode</a> übersetzt und dann von YARV interpretiert, wodurch sich ein Geschwindigkeitsvorteil ergibt. Weiterhin enthält diese Version eine leistungsstarke <a href="Regul%C3%A4rer_Ausdruck" title="Regulärer Ausdruck">Regexp</a>-Maschine namens Oniguruma und unterstützt Multibyte-Zeichensätze wie <a href="UTF-8" title="UTF-8">UTF-8</a>.
</p><p>Der offizielle Interpreter läuft auf den folgenden Betriebssystemen:
</p>
<ul><li><a href="Portable_Operating_System_Interface" class="mw-redirect" title="Portable Operating System Interface">POSIX</a>-kompatible Systeme (u.&nbsp;a. <a href="Linux" title="Linux">Linux</a>, <a href="Berkeley_Software_Distribution" title="Berkeley Software Distribution">BSD</a> und <a href="MacOS" title="MacOS">macOS</a>)</li>
<li><a href="Microsoft_Windows" title="Microsoft Windows">Windows</a> (aktuelle Versionen benötigen <a href="MSYS2" title="MSYS2">MSYS2</a> und laufen demnach ab <a href="Microsoft_Windows_Vista" title="Microsoft Windows Vista">Vista</a>)</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Alternative_Implementierungen">Alternative Implementierungen</h3></div>
<p>Es gibt zahlreiche alternative Ruby-Implementierungen mit unterschiedlichem Umfang und Zielen:
</p>
<ul><li><b><a href="JRuby" title="JRuby">JRuby</a></b> ist eine Implementierung des Ruby-Interpreters in <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> mit dem Ziel, Ruby nahtlos in die <a href="Java-Plattform" class="mw-redirect" title="Java-Plattform">Java-Plattform</a> zu integrieren. JRuby ist fast vollständig kompatibel zu Ruby 3.1. JRuby ist zudem kompatibel zu einigen Ruby-Erweiterungen von Rubinius (Foreign Function Interface, Multi-VM-API), allerdings nicht mit <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>-Erweiterungen von CRuby.</li>
<li><b>Mruby</b><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> ist eine weitere Ruby-Implementierung erschaffen vom Ruby-Schöpfer Yukihiro Matsumoto. Mruby ist eine auf <a href="Eingebettetes_System" title="Eingebettetes System">eingebettete Systeme</a> zugeschnittene Version von Ruby, welche sich durch geringen Speicherbedarf und hohe Modularisierung auszeichnet. Mruby stellt nicht die vollständige Funktionalität von CRuby bereit. Mruby kann den Quellcode in Bytecode übersetzen, welcher dann ohne <a href="Compiler" title="Compiler">Kompilationsschritt</a> interpretiert oder in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>-Programme eingebettet werden kann.</li>
<li><b>Opal</b><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> ist ein Compiler von Ruby nach <a href="JavaScript" title="JavaScript">JavaScript</a>. Es handelt sich um eine Implementierung der Ruby-Corelib und Stdlib sowie den zugehörigen Gems. Mit Opal lassen sich clientseitige Webanwendungen in Ruby realisieren. Es gibt einige Einschränkungen, die der Umsetzung nach JavaScript geschuldet sind.</li>
<li><b>TruffleRuby</b><sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> ist eine Ruby-Implementierung, die auf der <a href="GraalVM" title="GraalVM">GraalVM</a> läuft. Ziel der Implementierung ist es, die Vorteile der GraalVM mittels Ruby nutzbar zu machen. Diese sind Geschwindigkeit (Start- und Laufzeit), Parallelisierung und das <a href="Sandbox" title="Sandbox">kontrollierte Ausführen</a> von C-Erweiterungen. TruffleRuby ist <a href="Open-source" class="mw-redirect" title="Open-source">open-source</a> und wird maßgeblich von <a href="Oracle" title="Oracle">Oracle</a> entwickelt.</li>
<li><b>Fullstaqruby</b><sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> ist keine eigene Implementierung, sondern eine spezielle Distribution von MRI, die für den Einsatz auf Webservern optimiert wurde. Im Vergleich zur Referenzimplementierung verspricht Fullstaqruby eine bessere Performance bei geringerem Speicherverbrauch.</li></ul>
<p>Historische Ruby-Implementierungen:
</p>
<ul><li><b><a href="Rubinius" title="Rubinius">Rubinius</a></b> ist eine von <a href="Smalltalk_(Programmiersprache)" title="Smalltalk (Programmiersprache)">Smalltalk-80</a> inspirierte Implementierung. Abgesehen von der virtuellen Maschine ist Rubinius vollständig in Ruby geschrieben. Rubinius ist nahezu vollständig kompatibel zu Ruby 2.3. Rubinius nutzt die <a href="Low_Level_Virtual_Machine" class="mw-redirect" title="Low Level Virtual Machine">Low Level Virtual Machine</a> (LLVM) und ist kompatibel mit <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>-Erweiterungen der Referenzimplementierung. Seit 2020 gibt es keine Bewegung mehr im Projekt und die Projektwebseite ist mittlerweile leer.</li>
<li><b>IronRuby</b><sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup> ist eine Implementierung, die Ruby ins <a href=".NET_Framework" class="mw-redirect" title=".NET Framework">.NET Framework</a> integriert und in <a href="C-Sharp" title="C-Sharp">C#</a> implementiert ist.<br>Das Projekt ist seit 13. März 2011 inaktiv und wird nicht mehr weiterentwickelt.</li>
<li><b>Cardinal</b>, ein Interpreter für die virtuelle Maschine <a href="Parrot" title="Parrot">Parrot</a>. Das Projekt ist seit Juni 2013 inaktiv.</li>
<li><b>MagLev</b> ist eine Implementierung des Unternehmens Gemstone für deren <a href="Propriet%C3%A4r" title="Proprietär">proprietäre</a> Smalltalk VM. Das Projekt ist seit 2015 inaktiv.</li>
<li><b>MacRuby</b><sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup> ist eine Implementierung in <a href="Objective-C" title="Objective-C">Objective-C</a> von <a href="Apple" title="Apple">Apple</a>, die bis Version 0.4, wie Ruby 1.9, YARV nutzt, ab Version 0.5 allerdings, wie <a href="Rubinius" title="Rubinius">Rubinius</a>, auf die <a href="LLVM" title="LLVM">LLVM</a> setzt. Die Weiterentwicklung wurde mit dem 5. Januar 2015 eingestellt.</li>
<li><b>Ruby Enterprise Edition</b><sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> ist eine modifizierte Version der Referenzimplementierung, bei der im Wesentlichen der <a href="Garbage_Collector" class="mw-redirect" title="Garbage Collector">Garbage Collector</a> neu implementiert wurde. REE ist lediglich mit Ruby 1.8 kompatibel, die aktuellste Version stammt aus dem Jahr 2012.</li></ul>
<p>Die Kompatibilität zur Referenzimplementierung wird durch das RubySpec-Projekt überprüft. Es stellt dabei sowohl eine <a href="Testsuite_(Webapplikation)" title="Testsuite (Webapplikation)">Testsuite</a> als auch eine <a href="Spezifikation" title="Spezifikation">Spezifikation</a> für Ruby dar. RubySpec war ursprünglich ein Teil von Rubinius, wurde aber ausgelagert und danach auch von einer Vielzahl anderer Entwickler vorangetrieben. Es wird in vielen Ruby-Implementierungen verwendet.
</p><p>Mit Hilfe eines Versionsmanagers, wie beispielsweise RVM (Ruby Version Manager)<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup> oder Rbenv<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup>, besteht die Möglichkeit, mehrere Ruby-Versionen parallel zu betreiben.
</p><p>Ein wichtiges Merkmal der Implementierungen ist, ob sie in der Lage sind, <a href="Ruby_on_Rails" title="Ruby on Rails">Ruby on Rails</a> auszuführen. Derzeit können dies neben der Referenzimplementierung nur JRuby<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>, Rubinius<sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup> und TruffleRuby<sup id="cite_ref-20" class="reference"><a href="#cite_note-20"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Verbreitung_und_Einsatz">Verbreitung und Einsatz</h2></div>
<p>Ruby ist für alle gängigen Desktop-Betriebssysteme frei erhältlich, in den meisten Linux-Distributionen ist es in den mitgelieferten Paketquellen enthalten, unter macOS sogar vorinstalliert.
</p><p>Größte Verbreitung findet Ruby im Einsatz als Webserver-Skriptsprache. Das verbreitetste Framework hierbei ist <a href="Ruby_on_Rails" title="Ruby on Rails">Ruby on Rails</a>, wobei es aber zahlreiche Alternativen verschiedener Größen gibt (bspw. <a href="Sinatra_(Software)" title="Sinatra (Software)">Sinatra</a> und Hanami). Die Liste großer Railsprojekte ist lang, am bekanntesten sind möglicherweise kommerzielle Webseiten wie <a href="GitHub" title="GitHub">GitHub</a>, <a href="Airbnb" title="Airbnb">Airbnb</a> oder <a href="Shopify" title="Shopify">Shopify</a> oder Gemeinschaftsprojekte wie <a href="Diaspora_(Software)" class="mw-redirect" title="Diaspora (Software)">Diaspora</a>, <a href="Redmine" title="Redmine">Redmine</a> und <a href="Discourse_(Software)" title="Discourse (Software)">Discourse</a>. In Ruby geschriebene Webtechnologien wie <a href="Sass_(Stylesheet-Sprache)" title="Sass (Stylesheet-Sprache)">Sass</a> und <a href="Haml" title="Haml">Haml</a> finden auch außerhalb des Ruby-Ökosystems Verwendung.<br>
Weiter große Verbreitung findet Ruby als Skriptsprache zum Verwalten und Automatisieren von Serveraufgaben, angefangen als Ersatz für komplexere <a href="Bash_(Shell)" title="Bash (Shell)">Bash</a>-Skripte, als auch für größere Anwendungen, bspw. <a href="Puppet_(Software)" title="Puppet (Software)">Puppet</a> (Serverkonfiguration über das Netzwerk), <a href="Metasploit" title="Metasploit">Metasploit</a> (<a href="Penetrationstest_(Informatik)" title="Penetrationstest (Informatik)">Penetrationstests</a>), <a href="YaST" title="YaST">YaST</a> (<a href="OpenSUSE" title="OpenSUSE">OpenSUSE</a>-Serveradministration) und <a href="Vagrant_(Software)" title="Vagrant (Software)">Vagrant</a> (Verwaltung virtueller Maschinen).<br>
Ruby wird wegen der flexiblen Syntax ebenfalls gerne als domänenspezifische Sprache benutzt.
Mit <i>mruby</i> gibt es auch eine Ruby-Variante, die sich auf <a href="Eingebettetes_System" title="Eingebettetes System">Eingebettete Systeme</a> spezialisiert.
Vereinzelt wird Ruby auch als Skript-Sprache in Spielen verwendet, bspw. im <a href="RPG_Maker" title="RPG Maker">RPG Maker</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Kritik">Kritik</h2></div>
<p>Kritik an der Sprache wurde aus verschiedenen Gründen geübt:
</p>
<ul><li>Da Variablen vor Gebrauch nicht deklariert werden müssen, können bei Tippfehlern unerwartete Laufzeitfehler auftreten. Statische Codeanalyse, welche mit Ruby 3.0 hinzugefügt wurde, kann einige dieser Probleme verhindern.</li>
<li><a href="Metaprogrammierung" title="Metaprogrammierung">Metaprogrammierung</a> und Monkeypatching erlauben es einem Codestück, alle Klassen und Objekte des Prozesses, in dem es ausgeführt wird, zu ändern.<sup id="cite_ref-21" class="reference"><a href="#cite_note-21"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup></li></ul>
<p>Auch an der Referenzimplementierung bemängeln Kritiker mehrere Aspekte:
</p>
<ul><li>YARVs Global Interpreter Lock führt dazu, dass mehrere Threads eines Prozesses nicht gleichzeitig auf verschiedenen <a href="Prozessorkern" title="Prozessorkern">Prozessorkernen</a> ausgeführt werden können.<sup id="cite_ref-22" class="reference"><a href="#cite_note-22"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-23" class="reference"><a href="#cite_note-23"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup> Seit Ruby 3.0 gibt es ein alternatives System für Nebenläufigkeit, genannt <i>Ractor</i>, welches ohne GIL auskommt. Allerdings muss vorhandener Code dafür umgeschrieben werden.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Sonstiges">Sonstiges</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Nutzungsbedingungen">Nutzungsbedingungen</h3></div>
<p>Ruby ist eine <a href="Freie_Software" title="Freie Software">freie Software</a>. Deshalb ist es kostenlos nutzbar und im <a href="Quelltext" title="Quelltext">Quelltext</a> verfügbar. Dadurch ergibt sich die Möglichkeit, die Sprache an seine eigenen Bedürfnisse anzupassen oder sie in eigene Programme einzubinden.
</p><p>Der Interpreter und die Standardbibliothek von Ruby sind grundsätzlich unter den Bedingungen der <a href="BSD-Lizenz#Werbeklausel" title="BSD-Lizenz">2-clause BSD-Lizenz</a> nutzbar. Des Weiteren besteht die Möglichkeit, Ruby unter einer eigenen freien Lizenz zu verwenden.<sup id="cite_ref-24" class="reference"><a href="#cite_note-24"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup> Die Ruby-Lizenz ist GPL-kompatibel und wird von der <a href="Free_Software_Foundation" title="Free Software Foundation">Free Software Foundation</a> als „frei“ akzeptiert.<sup id="cite_ref-25" class="reference"><a href="#cite_note-25"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup>
</p><p>Ältere Versionen von Ruby (1.9.2 und früher) verwendeten anstatt der BSD-Lizenz die <a href="GNU_General_Public_License" title="GNU General Public License">GPL V2</a>. Als Begründung für den Wechsel wurden Inkompatibilitäten der alten Lizenzierung mit der GPL V3 angeführt.<sup id="cite_ref-26" class="reference"><a href="#cite_note-26"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-27" class="reference"><a href="#cite_note-27"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="RubyForge">RubyForge</h3></div>
<p>RubyForge war eine <a href="Softwareentwicklungsplattform#Öffentliche_Plattformen" title="Softwareentwicklungsplattform">öffentliche Softwareentwicklungsplattform</a> für in Ruby geschriebene Softwareprojekte. Sie wurde im Jahr 2003 von Ruby Central gestartet, um der Ruby-Community eine Heimat für ihre <a href="Open_Source" title="Open Source">Open-Source</a>-Projekte zur Verfügung zu stellen.
</p><p>Am 29. November 2009 wurden dort über 9.300 Projekte und mehr als 94.683 Benutzer geführt<sup id="cite_ref-rubyforge_28-0" class="reference"><a href="#cite_note-rubyforge-28"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup>, am 15. Mai 2014 wurde der Dienst schließlich eingestellt.<sup id="cite_ref-29" class="reference"><a href="#cite_note-29"><span class="cite-bracket">[</span>29<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<p><b>Für Programmieranfänger</b>
</p>
<ul><li>Chris Pine: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Learn to Program</cite>. 2. Auflage. The Pragmatic Bookshelf, Raleigh/Dallas 2009, ISBN 978-1-934356-36-4 (englisch, <a rel="nofollow" class="external text" href="https://pine.fm/LearnToProgram/">Kürzere Version kostenlos online</a>).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Ruby+%28Programmiersprache%29&amp;rft.au=Chris+Pine&amp;rft.btitle=Learn+to+Program&amp;rft.date=2009&amp;rft.edition=2.&amp;rft.genre=book&amp;rft.isbn=9781934356364&amp;rft.place=Raleigh%2FDallas&amp;rft.pub=The+Pragmatic+Bookshelf" style="display:none">&nbsp;</span></li></ul>
<p><b>Einstieg für Programmierer</b>
</p>
<ul><li>Peter Cooper: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Beginning Ruby. From Novice to Professional</cite>. 3. Auflage. Apress, New York City 2016, ISBN 978-1-4842-1279-0 (englisch, <a rel="nofollow" class="external text" href="https://github.com/apress/beg-ruby-3ed">Quellcode</a>).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Ruby+%28Programmiersprache%29&amp;rft.au=Peter+Cooper&amp;rft.btitle=Beginning+Ruby.+From+Novice+to+Professional&amp;rft.date=2016&amp;rft.edition=3.&amp;rft.genre=book&amp;rft.isbn=9781484212790&amp;rft.place=New+York+City&amp;rft.pub=Apress" style="display:none">&nbsp;</span></li>
<li>Dave Thomas, Chad Fowler, Andy Hunt: <cite class="lang" lang="en" dir="auto" style="font-style:italic">Programming Ruby 1.9 &amp; 2.0</cite>. 2. Auflage. The Pragmatic Bookshelf, Raleigh/Dallas 2013, ISBN 978-1-937785-49-9 (englisch, <a rel="nofollow" class="external text" href="https://pragprog.com/titles/ruby4/errata">Errata</a>, <a rel="nofollow" class="external text" href="https://pragprog.com/titles/ruby4/source_code">Quellcode</a>).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Ruby+%28Programmiersprache%29&amp;rft.au=Dave+Thomas%2C+Chad+Fowler%2C+Andy+Hunt&amp;rft.btitle=Programming+Ruby+1.9+%26+2.0&amp;rft.date=2013&amp;rft.edition=2.&amp;rft.genre=book&amp;rft.isbn=9781937785499&amp;rft.place=Raleigh%2FDallas&amp;rft.pub=The+Pragmatic+Bookshelf" style="display:none">&nbsp;</span></li></ul>
<p><b>Vertiefung für Programmierer</b>
</p>
<ul><li>David A. Black: <cite class="lang" lang="en" dir="auto" style="font-style:italic">The Well-Grounded Rubyist</cite>. 2. Auflage. Manning, Shelter Island 2014, ISBN 978-1-61729-169-2 (englisch, <a rel="nofollow" class="external text" href="https://manning-content.s3.amazonaws.com/download/0/6bfe05f-627d-4048-b9be-ac0ee85d61ce/Black_TheWellGroundedRubyist_Err1.html">Errata</a>, <a rel="nofollow" class="external text" href="https://manning-content.s3.amazonaws.com/download/c/01aa8a7-b69b-41f2-a172-4582c34d18b2/twgr2E-code.zip">Quellcode</a>).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Ruby+%28Programmiersprache%29&amp;rft.au=David+A.+Black&amp;rft.btitle=The+Well-Grounded+Rubyist&amp;rft.date=2014&amp;rft.edition=2.&amp;rft.genre=book&amp;rft.isbn=9781617291692&amp;rft.place=Shelter+Island&amp;rft.pub=Manning" style="display:none">&nbsp;</span></li>
<li>Hal Fulton, André Arko: <cite class="lang" lang="en" dir="auto" style="font-style:italic">The Ruby Way. Solutions and Techniques in Ruby Programming</cite>. 3. Auflage. Addison-Wesley, Upper Saddle River, u.&nbsp;a. 2015, ISBN 978-0-321-71463-3 (englisch, <a rel="nofollow" class="external text" href="http://ptgmedia.pearsoncmg.com/images/9780321714633/samplepages/9780321714633.pdf">Auszug</a> [PDF]).<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Ruby+%28Programmiersprache%29&amp;rft.au=Hal+Fulton%2C+Andr%C3%A9+Arko&amp;rft.btitle=The+Ruby+Way.+Solutions+and+Techniques+in+Ruby+Programming&amp;rft.date=2015&amp;rft.edition=3.&amp;rft.genre=book&amp;rft.isbn=9780321714633&amp;rft.place=Upper+Saddle+River%2C+u.+a.&amp;rft.pub=Addison-Wesley" style="display:none">&nbsp;</span></li></ul>
<p><b>Gesamtdarstellungen</b>
</p>
<ul><li>David Flanagan, Yukihiro Matsumoto: <i>Die Programmiersprache Ruby</i>. O’Reilly Media, 2008, ISBN 978-3-89721-874-1</li></ul>
<p><b>Für Fortgeschrittene</b>
</p>
<ul><li>Lucas Carlson, Leonard Richardson: <i>Ruby Cookbook</i>. O’Reilly Media, 2. Auflage 2015, ISBN 1-4493-7371-2 (englisch)</li>
<li>Pat Shaughnessy: <i>Ruby Under a Microscope</i>. No Starch Press, 1. Auflage 2013, ISBN 1-59327-527-7 (englisch)</li>
<li>Russ Olsen: <i>Eloquent Ruby</i>. Addison-Wesley Professional, 2011, ISBN 978-0-321-58410-6 (englisch)</li>
<li>Russ Olsen: <i>Design Patterns in Ruby</i>. Addison-Wesley Professional, 2007, ISBN 978-0-321-49045-2 (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Normen_und_Standards">Normen und Standards</h2></div>
<ul><li>ISO/IEC 30170 (englisch; standardisiert Ruby auf über 317 Seiten). Erste Version April 2012.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noresize noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Commons"></span></span></div><b><span class=""><a class="external text" href="https://commons.wikimedia.org/wiki/Category:Ruby_programming_language?uselang=de"><span lang="en">Commons</span>: Ruby</a></span></b>&nbsp;– Sammlung von Bildern, Videos und Audiodateien</div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Wikibooks"></span></span></div><b><a href="https://de.wikibooks.org/wiki/Ruby-Programmierung" class="extiw external" title="b:Ruby-Programmierung">Wikibooks: Ruby-Programmierung</a></b>&nbsp;– Lern- und Lehrmaterialien</div>
<ul><li><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/de/">Offizielle Website von Ruby</a></li>
<li><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/de/documentation/">Zusammenstellung von Tutorials zu Ruby</a></li>
<li><a rel="nofollow" class="external text" href="https://ruby-doc.org/">Dokumentationssammlung zu Ruby</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://curlie.org/World/Deutsch/Computer/Programmieren/Sprachen/Ruby/">Linkkatalog zum Thema Ruby</a> bei <i>curlie.org</i> (ehemals <a href="DMOZ" title="DMOZ">DMOZ</a>)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-_e0d9a819dcdfffc1-1"><span class="mw-cite-backlink"><a href="#cite_ref-_e0d9a819dcdfffc1_1-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/en/about/"><cite style="font-style:italic">www.ruby-lang.org</cite>.</a></span>
</li>
<li id="cite_note-_03a3180b7ac7d47d-2"><span class="mw-cite-backlink"><a href="#cite_ref-_03a3180b7ac7d47d_2-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/"><cite style="font-style:italic">www.ruby-lang.org</cite>.</a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.digitalmars.com/d/1.0/">D Programming Language 1.0 , Intro.</a> Digital Mars</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=59579">iso.org</a></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://blog.nicksieger.com/articles/2006/10/20/rubyconf-history-of-ruby">RubyConf: History of Ruby</a></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html">Ein Interview mit dem Schöpfer von Ruby</a></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/en/about/"><i>About Ruby.</i></a><span class="Abrufdatum"> Abgerufen am 4.&nbsp;Oktober 2018</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=About+Ruby&amp;rft.description=About+Ruby&amp;rft.identifier=https%3A%2F%2Fwww.ruby-lang.org%2Fen%2Fabout%2F">&nbsp;</span></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.infoq.com/news/2007/12/ruby-19/"><i>Ruby 1.9 released.</i></a><span class="Abrufdatum"> Abgerufen am 5.&nbsp;September 2020</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Ruby+1.9+released&amp;rft.description=Ruby+1.9+released&amp;rft.identifier=https%3A%2F%2Fwww.infoq.com%2Fnews%2F2007%2F12%2Fruby-19%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://mruby.org/"><i>Mruby: Projektwebseite.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Mruby%3A+Projektwebseite&amp;rft.description=Mruby%3A+Projektwebseite&amp;rft.identifier=https%3A%2F%2Fmruby.org%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://opalrb.com/"><i>Opal: Projektwebseite.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Opal%3A+Projektwebseite&amp;rft.description=Opal%3A+Projektwebseite&amp;rft.identifier=https%3A%2F%2Fopalrb.com%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.graalvm.org/22.2/reference-manual/ruby/"><i>TruffleRuby: Eintrag zum Projekt im Handbuch der GraalVM.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=TruffleRuby%3A+Eintrag+zum+Projekt+im+Handbuch+der+GraalVM&amp;rft.description=TruffleRuby%3A+Eintrag+zum+Projekt+im+Handbuch+der+GraalVM&amp;rft.identifier=https%3A%2F%2Fwww.graalvm.org%2F22.2%2Freference-manual%2Fruby%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://fullstaqruby.org/"><i>Fullstaqruby: Projektwebseite.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Fullstaqruby%3A+Projektwebseite&amp;rft.description=Fullstaqruby%3A+Projektwebseite&amp;rft.identifier=https%3A%2F%2Ffullstaqruby.org%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><a href="#cite_ref-13">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://www.ironruby.net/"><i>Verwaiste Projektwebseite von Ironruby.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Verwaiste+Projektwebseite+von+Ironruby&amp;rft.description=Verwaiste+Projektwebseite+von+Ironruby&amp;rft.identifier=http%3A%2F%2Fwww.ironruby.net%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><a href="#cite_ref-14">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://macruby.org/"><i>Verwaiste Projektwebseite von MagRuby.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Verwaiste+Projektwebseite+von+MagRuby&amp;rft.description=Verwaiste+Projektwebseite+von+MagRuby&amp;rft.identifier=http%3A%2F%2Fmacruby.org%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><a href="#cite_ref-15">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://www.rubyenterpriseedition.com/"><i>Verwaiste Projektwebseite von Ruby Enterprise Edition.</i></a><span class="Abrufdatum"> Abgerufen am 3.&nbsp;November 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Verwaiste+Projektwebseite+von+Ruby+Enterprise+Edition&amp;rft.description=Verwaiste+Projektwebseite+von+Ruby+Enterprise+Edition&amp;rft.identifier=http%3A%2F%2Fwww.rubyenterpriseedition.com%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><a href="#cite_ref-16">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://rvm.io/"><i>RVM: Ruby Version Manager – RVM Ruby Version Manager - Dokumentation.</i></a><span class="Abrufdatum"> Abgerufen am 4.&nbsp;Oktober 2018</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=RVM%3A+Ruby+Version+Manager+%E2%80%93+RVM+Ruby+Version+Manager+-+Dokumentation&amp;rft.description=RVM%3A+Ruby+Version+Manager+%E2%80%93+RVM+Ruby+Version+Manager+-+Dokumentation&amp;rft.identifier=https%3A%2F%2Frvm.io%2F&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><a href="#cite_ref-17">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://github.com/rbenv/rbenv"><i>rbenv/rbenv.</i></a><span class="Abrufdatum"> Abgerufen am 4.&nbsp;Oktober 2018</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=rbenv%2Frbenv&amp;rft.description=rbenv%2Frbenv&amp;rft.identifier=https%3A%2F%2Fgithub.com%2Frbenv%2Frbenv&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><a href="#cite_ref-18">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://github.com/jruby/jruby/wiki"><i>JRuby Wiki.</i></a><span class="Abrufdatum"> Abgerufen am 23.&nbsp;Februar 2017</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=JRuby+Wiki&amp;rft.description=JRuby+Wiki&amp;rft.identifier=https%3A%2F%2Fgithub.com%2Fjruby%2Fjruby%2Fwiki&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-19"><span class="mw-cite-backlink"><a href="#cite_ref-19">↑</a></span> <span class="reference-text"><span class="cite">Evan Phoenix: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20160322181439/http://blog.fallingsnow.net/2008/05/17/rails-on-rubinius/"><i>Rails on Rubinius.</i></a> 17.&nbsp;Mai 2008, archiviert vom <style data-mw-deduplicate="TemplateStyles:r250917974">
/* start https://de.wikipedia.org/ */


.mw-parser-output .dewiki-iconexternal>a{background-position:center right!important;background-repeat:no-repeat!important}body.skin-minerva .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/OOjs_UI_icon_external-link-ltr-progressive.svg")!important;background-size:10px!important;padding-right:13px!important}body.skin-timeless .mw-parser-output .dewiki-iconexternal>a,body.skin-monobook .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/MediaWiki_external_link_icon.svg")!important;padding-right:13px!important}body.skin-vector .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/Link.ernal-small-ltr-progressive.svg")!important;background-size:0.857em!important;padding-right:1em!important}


/* end https://de.wikipedia.org/ */
</style><span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fblog.fallingsnow.net%2F2008%2F05%2F17%2Frails-on-rubinius%2F">Original</a></span> am <span style="white-space:nowrap;">22.&nbsp;März 2016</span><span>;</span><span class="Abrufdatum"> abgerufen am 23.&nbsp;Februar 2017</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Rails+on+Rubinius&amp;rft.description=Rails+on+Rubinius&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20160322181439%2Fhttp%3A%2F%2Fblog.fallingsnow.net%2F2008%2F05%2F17%2Frails-on-rubinius%2F&amp;rft.creator=Evan+Phoenix&amp;rft.date=2008-05-17&amp;rft.source=http://blog.fallingsnow.net/2008/05/17/rails-on-rubinius/&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-20"><span class="mw-cite-backlink"><a href="#cite_ref-20">↑</a></span> <span class="reference-text"><span class="cite">Benoit Daloze: <a rel="nofollow" class="external text" href="https://speakerdeck.com/eregon/running-rack-and-rails-faster-with-truffleruby"><i>Running Rack and Rails Faster with TruffleRuby.</i></a> 4.&nbsp;September 2020,<span class="Abrufdatum"> abgerufen am 30.&nbsp;September 2021</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Running+Rack+and+Rails+Faster+with+TruffleRuby&amp;rft.description=Running+Rack+and+Rails+Faster+with+TruffleRuby&amp;rft.identifier=https%3A%2F%2Fspeakerdeck.com%2Feregon%2Frunning-rack-and-rails-faster-with-truffleruby&amp;rft.creator=Benoit+Daloze&amp;rft.date=2020-09-04&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-21"><span class="mw-cite-backlink"><a href="#cite_ref-21">↑</a></span> <span class="reference-text"><span class="cite">Avdi Grimm: <a rel="nofollow" class="external text" href="http://www.virtuouscode.com/2008/02/23/why-monkeypatching-is-destroying-ruby/"><i>Monkeypatching is Destroying Ruby.</i></a> 23.&nbsp;Februar 2008,<span class="Abrufdatum"> abgerufen am 23.&nbsp;Februar 2017</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Monkeypatching+is+Destroying+Ruby&amp;rft.description=Monkeypatching+is+Destroying+Ruby&amp;rft.identifier=http%3A%2F%2Fwww.virtuouscode.com%2F2008%2F02%2F23%2Fwhy-monkeypatching-is-destroying-ruby%2F&amp;rft.creator=Avdi+Grimm&amp;rft.date=2008-02-23&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-22"><span class="mw-cite-backlink"><a href="#cite_ref-22">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.infoq.com/news/2007/05/ruby-threading-futures">infoq.com</a></span>
</li>
<li id="cite_note-23"><span class="mw-cite-backlink"><a href="#cite_ref-23">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/">igvita.com</a></span>
</li>
<li id="cite_note-24"><span class="mw-cite-backlink"><a href="#cite_ref-24">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.ruby-lang.org/en/about/license.txt"><i>Rubys Lizenzbedingungen.</i></a><span class="Abrufdatum"> Abgerufen am 23.&nbsp;Februar 2017</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Rubys+Lizenzbedingungen&amp;rft.description=Rubys+Lizenzbedingungen&amp;rft.identifier=https%3A%2F%2Fwww.ruby-lang.org%2Fen%2Fabout%2Flicense.txt">&nbsp;</span></span>
</li>
<li id="cite_note-25"><span class="mw-cite-backlink"><a href="#cite_ref-25">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://www.gnu.org/licenses/license-list.html#Ruby"><i>Liste der GPL-kompatiblen Lizenzen.</i></a><span class="Abrufdatum"> Abgerufen am 23.&nbsp;Februar 2017</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Liste+der+GPL-kompatiblen+Lizenzen&amp;rft.description=Liste+der+GPL-kompatiblen+Lizenzen&amp;rft.identifier=https%3A%2F%2Fwww.gnu.org%2Flicenses%2Flicense-list.html%23Ruby">&nbsp;</span></span>
</li>
<li id="cite_note-26"><span class="mw-cite-backlink"><a href="#cite_ref-26">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20150611110114/http://www.ruby-forum.com/topic/216010"><i>Mailinglistendiskussion zum Lizenzwechsel.</i></a> Archiviert vom <span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fwww.ruby-forum.com%2Ftopic%2F216010">Original</a></span> am <span style="white-space:nowrap;">11.&nbsp;Juni 2015</span><span>;</span><span class="Abrufdatum"> abgerufen am 8.&nbsp;Juli 2012</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Mailinglistendiskussion+zum+Lizenzwechsel&amp;rft.description=Mailinglistendiskussion+zum+Lizenzwechsel&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20150611110114%2Fhttp%3A%2F%2Fwww.ruby-forum.com%2Ftopic%2F216010&amp;rft.source=http://www.ruby-forum.com/topic/216010">&nbsp;</span></span>
</li>
<li id="cite_note-27"><span class="mw-cite-backlink"><a href="#cite_ref-27">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20100827"><i>Beschluss zum Lizenzwechsel auf dem Ruby Developers Meeting 2010.</i></a><span class="Abrufdatum"> Abgerufen am 23.&nbsp;Februar 2017</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Beschluss+zum+Lizenzwechsel+auf+dem+Ruby+Developers+Meeting+2010&amp;rft.description=Beschluss+zum+Lizenzwechsel+auf+dem+Ruby+Developers+Meeting+2010&amp;rft.identifier=https%3A%2F%2Fbugs.ruby-lang.org%2Fprojects%2Fruby%2Fwiki%2FDevelopersMeeting20100827">&nbsp;</span></span>
</li>
<li id="cite_note-rubyforge-28"><span class="mw-cite-backlink"><a href="#cite_ref-rubyforge_28-0">↑</a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r261891140">
/* start https://de.wikipedia.org/ */


.mw-parser-output .webarchiv-memento a{color:inherit}


/* end https://de.wikipedia.org/ */
</style><a rel="nofollow" class="external text" href="https://web.archive.org/web/20140531194331/https://rubyforge.org/">RubyForge</a> (<span class="webarchiv-memento"><a href="Webarchivierung#Begrifflichkeiten" title="Webarchivierung">Memento</a></span> vom 31. Mai 2014 im <i><a href="Internet_Archive" title="Internet Archive">Internet Archive</a></i>)</span>
</li>
<li id="cite_note-29"><span class="mw-cite-backlink"><a href="#cite_ref-29">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://twitter.com/evanphx/status/399552820380053505"><i>Twitter-Nachricht von Evan Phoenix.</i></a><span class="Abrufdatum"> Abgerufen am 28.&nbsp;März 2014</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3ARuby+%28Programmiersprache%29&amp;rft.title=Twitter-Nachricht+von+Evan+Phoenix&amp;rft.description=Twitter-Nachricht+von+Evan+Phoenix&amp;rft.identifier=https%3A%2F%2Ftwitter.com%2Fevanphx%2Fstatus%2F399552820380053505">&nbsp;</span></span>
</li>
</ol>
<div class="hintergrundfarbe1 rahmenfarbe1 navigation-not-searchable normdaten-typ-s" style="border-style: solid; border-width: 1px; clear: left; margin-bottom:1em; margin-top:1em; padding: 0.25em; overflow: hidden; word-break: break-word; word-wrap: break-word;" id="normdaten">
<div style="display: table-cell; vertical-align: middle; width: 100%;">
<div>
Normdaten&nbsp;(Sachbegriff): <a href="Gemeinsame_Normdatei" title="Gemeinsame Normdatei">GND</a>: <span class="-print"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4653817-3">4653817-3</a></span> </div>
</div></div></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-12-01" href="https://de.wikipedia.org/wiki/?title=Ruby_(Programmiersprache)&amp;oldid=262045730">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>